package com.ly.cloud.service.impl;

import java.util.Date;
import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.ly.cloud.dto.StudentInfoDto;
import com.ly.cloud.entity.StudentInfoPo;
import com.ly.cloud.exception.CloudException;
import com.ly.cloud.exception.mapper.DBException;
import com.ly.cloud.mapper.StudentInfoMapper;
import com.ly.cloud.service.StudentInfoService;
import com.ly.cloud.vo.GradeVo;
import com.ly.cloud.vo.RegisterInfoVo;
import com.ly.cloud.vo.StudentDetailInfoVo;
import com.ly.cloud.vo.StudentInfoVo;
import com.ly.cloud.vo.XjYdVo;

@Service
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public class StudentInfoServiceImpl implements StudentInfoService {

	@Autowired
	private StudentInfoMapper studentInfoMapper;

	
	/**(non-Javadoc)
	 * Title: insertStudentInfo
	 * Description: 
	 * 添加学生信息
	 * @param dto 条件封装对象
	 * @param createMan 创建人
	 * @return  boolean
	 * @date: 2018年12月21日
	 * @author luhuacong
	 */
	@Override
	public boolean insertStudentInfo(StudentInfoDto dto,String createMan) {
		/**
		 * 取出班里最后一名学生的学号
		 */
		String xsid = studentInfoMapper.selectXsid(dto.getBjid());
		
		/**
		 *如果xsid为空，则表示该班上没有学生 
		 */
		if(xsid == null) {
			//学号 = 班级编号 +01
			dto.setXsid(dto.getBjid()+"01");
			dto.setXh(dto.getBjid()+"01");
		}else {
			//取学号最后两位并转换为int类型
			Integer i = Integer.parseInt(xsid.substring(xsid.length()-2, xsid.length()));
			i++;
			//如果后两位<10
			if(i<10) {
				dto.setXsid(dto.getBjid()+"0"+i);
				dto.setXh(dto.getBjid()+"0"+i);
			}else {
				dto.setXsid(dto.getBjid()+i);
				dto.setXh(dto.getBjid()+i);
			}
			
		}
		
		StudentInfoPo po = new StudentInfoPo();
		BeanUtils.copyProperties(dto, po);
		
		po.setCjsj(new Date());
		po.setCjr(createMan);
		
		try {
			Integer i = studentInfoMapper.insert(po);
			if(i>0) {
				return true;
			}else {
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("添加学生信息失败！", e);
		}
	}


	/**(non-Javadoc)
	 * Title: deleteXsInfoByIds
	 * Description: 
	 * 根据学生id集合批量删除学生
	 * @param xsidList 学生id集合
	 * @return  成功删除的个数
	 * @date: 2018年12月21日
	 * @author luhuacong
	 */
	@Override
	public Integer deleteXsInfoByIds(List<String> xsidList) {
		try {
			return studentInfoMapper.deleteBatchIds(xsidList);
		} catch (Exception e) {
			throw new DBException("删除学生信息失败！", e);
		}
	}


	/**(non-Javadoc)
	 * Title: updateXsInfo
	 * Description: 
	 * 修改学生信息
	 * @param dto 条件封装对象
	 * @param xgr 修改人
	 * @return  boolean
	 * @date: 2018年12月21日
	 * @author luhuacong
	 */
	@Override
	public boolean updateXsInfo(StudentInfoDto dto, String xgr) {
		StudentInfoPo po = new StudentInfoPo();
		BeanUtils.copyProperties(dto, po);
		/**
		 * 查看修改后的学号有没有重复
		 */
		EntityWrapper<StudentInfoPo> ew = new EntityWrapper<StudentInfoPo>();
		ew.where("XH = {0}", po.getXh());
		Integer count = 0;
		List<StudentInfoPo> list = null;
		try {
			list = studentInfoMapper.selectList(ew);			
		} catch (Exception e1) {
			throw new DBException("修改过程发生异常",e1);
		}
		//如果修改后学号有冲突
		if(list!=null && !list.get(0).getXh().equals(dto.getXh())) {
			throw new DBException("修改失败，该学号已经存在");
		}
		
		po.setXgr(xgr);
		po.setXgsj(new Date());
		try {
			Integer i = studentInfoMapper.updateById(po);
			if(i>0) {
				return true;
			}else {
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("修改学生信息失败！", e);
		}
	}


	/** 
	 * Method Name:selectXsListByCon
	 * Description:根据条件查询
	 * @param page 
	 * @param dto 条件封装对象
	 * @return List<StudentInfoVo>
	 * @author LuHuaCong
	 * @date: 2018年12月22日
	 */
	@Override
	public Page<StudentInfoVo> selectXsListByCon(Page<StudentInfoVo> page, StudentInfoDto dto) {
		try {
			List<StudentInfoVo> voList = studentInfoMapper.selectXsListByCon(page, dto);
			return page.setRecords(voList);
		} catch (Exception e) {
			e.printStackTrace();
			throw new CloudException("查询异常，请重试!", e);
		}
	}


	/** 
	 * MethodName:selectRegisterInfo
	 * Description:根据学号查询注册状态
	 * @param page
	 * @param xsid 学号
	 * @return List<RegisterInfoVo>
	 * @author LuHuaCong
	 * @date: 2018年12月24日
	 */
	@Override
	public Page<RegisterInfoVo> selectRegisterInfo(Page<RegisterInfoVo> page, String xsid) {
		try {			
			return page.setRecords(studentInfoMapper.selectRegisterInfo(page, xsid));
		} catch (Exception e) {
			e.printStackTrace();
			throw new CloudException("查询注册信息异常，请重试!", e);
		}
	}


	/** 
	 * MethodName:selectRegisterInfo
	 * Description:根据学号查询学籍异动信息
	 * @param xsid 学号
	 * @return Page<XjYdVo>
	 * @author LuHuaCong
	 * @date: 2018年12月24日
	 */
	@Override
	public Page<XjYdVo> selectXjYdInfo(Page<XjYdVo> page, String xsid) {
		try {			
			return page.setRecords(studentInfoMapper.selectXjYdInfo(page, xsid));
		} catch (Exception e) {
			throw new CloudException("查询学籍异动信息异常，请重试!", e);
		}
	}


	/** 
	 * MethodName:selectGradeInfo
	 * Description:根据学号查询学生成绩信息
	 * @param page
	 * @param xsid 学号
	 * @return List<GradeVo>
	 * @author LuHuaCong
	 * @date: 2018年12月24日
	 */
	@Override
	public Page<GradeVo> selectGradeInfo(Page<GradeVo> page, String xsid) {
		try {			
			return page.setRecords(studentInfoMapper.selectGradeInfo(page, xsid));
		} catch (Exception e) {
			throw new CloudException("查询学籍异动信息异常，请重试!", e);
		}
	}

	/** 
	 * MethodName:selectXsXxXxByid
	 * Description:根据学号查询学生详细信息
	 * @param xsid 学号
	 * @return StudentDetailInfoVo
	 * @date: 2018年1月8日
	 */
	@Override
	public StudentDetailInfoVo selectXsXxXxByid(String xsid) {
		try {
			StudentInfoPo po = studentInfoMapper.selectById(xsid);
			StudentDetailInfoVo vo = new StudentDetailInfoVo();
			BeanUtils.copyProperties(po, vo);
			return vo;
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("查询学生详细信息失败",e);
		}
				
	}
}
